﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TicketsPhone.Domain.Entities;
using TicketsPhone.Domain.Access;
using System.Configuration;
using System.Timers;

namespace TicketsPhone.PruebaServicio
{
    class Program
    {
        static void Main(string[] args)
        {
            new Program();
        }

        public Program()
        {
            //CargarTimer();
            PruebaSMS();
        }

        private void PruebaSMS()
        {
            ServicioSMS.WsSMSClient ws = new ServicioSMS.WsSMSClient();
            ws.EnviarSMS("prueba", "dos");
        }

        Timer timerTurnos = new Timer();

        #region Metodos

        TurnoRepositorio _turno = new TurnoRepositorio();
        SucursalRepositorio _sucursal = new SucursalRepositorio();
        private void CargarTimer()
        {
            int minutosDeEnvio = Convert.ToInt32(ConfigurationManager.AppSettings["segundosIntervalo"]);
            timerTurnos.Interval = minutosDeEnvio * 1000;
            timerTurnos.Start();
            ProcesarSolicitudes();
            
        }


        /// <summary>
        /// Valida si el horario de la solicitud del turno está disponible o no
        /// </summary>
        /// <param name="horario">Datos del horario en el que se solicita el turno</param>
        /// <returns></returns>
        private void ProcesarSolicitudes()
        {

            //EstadoTurno nuevoEstado = EstadoTurno.Solicitado;

            ////procesa los primeros 20 turnos
            //List<Turno> turnosSolicitados = _turno.ObtenerTurnosSolicitados().Skip(0).Take(Convert.ToInt32(ConfigurationManager.AppSettings["procesadosPorTurno"])).ToList();

            //foreach (Turno turno in turnosSolicitados)
            //{
            //    _turno.Objeto = turno;

            //    Horario horario = new Horario();
            //    horario.HoraInicio = turno.HoraInicio;
            //    horario.HoraFin = turno.HoraFin;
            //    horario.Sucursal.IdSucursal = turno.IdSucursal.Value;
            //    horario.Dia = turno.FechaTurno.Value.DayOfWeek;

            //    List<Horario> listaHorarios = new List<Horario>();

            //    int turnosSimultaneos = _turno.ContarTurnosSimultaneos();
            //    int cajerosActivos = _sucursal.ObtenerCajerosActivos(horario);

            //    Console.WriteLine(string.Format( "Turno:({4}-{0}-{1}) simultaneos:{2} cajeros activos:{3}", horario.HoraInicio, horario.HoraFin, turnosSimultaneos, cajerosActivos,horario.Dia));

            //    //Si los turnos solcitados son menores  a los cajeros activos en determinada hora puede asignar el turno
            //    if (turnosSimultaneos < cajerosActivos)
            //    {
            //        //actualiza el turno a aceptado y envia mensaje
            //        nuevoEstado = EstadoTurno.Aceptado;

                    
            //    }
            //    else
            //    {
            //        //actualizaa el turno a rechazado, busca opciones de hora y envia mensaje
            //        nuevoEstado = EstadoTurno.Negado;
            //        //busca turnos disponibles
            //        listaHorarios = BuscarTurnosDisponibles(turno);
            //    }

            //    _turno.EditarEstadoTurno(turno.IdTurno.Value, nuevoEstado);

                

            //}

            

        }

        /// <summary>
        /// Busca turnos disponibles en las siguientes horas
        /// </summary>
        public List<Horario> BuscarTurnosDisponibles(Turno turno)
        {
            TurnoRepositorio _turno = new TurnoRepositorio();

            turno.HoraFin.AgregarMinutos(5);
            turno.HoraInicio.AgregarMinutos(5);
            _turno.Objeto = turno;

            Horario horario = new Horario();
            horario.HoraInicio = turno.HoraInicio;
            horario.HoraFin = turno.HoraFin;
            horario.Sucursal.IdSucursal = turno.IdSucursal.Value;
            horario.Dia = turno.FechaTurno.Value.DayOfWeek;

            int encontrados = 0;
            int intentos = 0;
            int maximoIntentos = 20;

            //listado de horarios disponibles
            List<Horario> listaHorarios = new List<Horario>();

            //intenta buscar los siguientes 3 turnos disponibles en el dia
            while (encontrados < 3)
            {

                if (intentos == maximoIntentos)
                    break;

                //si el turno consultado está disponible lo separa
                if (_turno.ContarTurnosSimultaneos() < _sucursal.ObtenerCajerosActivos(horario))
                {
                    encontrados++;
                    listaHorarios.Add(horario);
                    Console.WriteLine("--------->Horario:{0} hasta {1}", horario.HoraInicio.ToString(), horario.HoraFin.ToString());
                }

                horario.HoraFin = turno.HoraFin.AgregarMinutos(5);
                horario.HoraInicio = turno.HoraInicio.AgregarMinutos(5);

                

                intentos++;
            }

            return listaHorarios;
        }

        /// <summary>
        /// Carga el mensaje de retorno cuando no hay disponiblidad con los nuevos horarios
        /// </summary>
        /// <param name="horasDisponibles"></param>
        /// <returns></returns>
        public string CargarMensajeDisponibles(List<Horario> horasDisponibles)
        {
            StringBuilder strMensaje = new StringBuilder();

            strMensaje.Append("No hay disponibilidad, pero si:");

            foreach (Horario hora in horasDisponibles)
            {
                strMensaje.AppendFormat("/{0}", hora.HoraInicio);
            }

            return strMensaje.ToString();
        }



        #endregion

    }
}
